#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

void listProcesses() {
    struct dirent *entry;
    DIR *dir = opendir("/proc"); // 打开/proc目录

    if (!dir) {
        perror("opendir"); // 打开目录失败，输出错误信息
        exit(EXIT_FAILURE); // 退出程序
    }

    while ((entry = readdir(dir))) {
        if (entry->d_type == DT_DIR) {
            // 检查目录项类型，如果是目录则表示一个进程
            int pid = atoi(entry->d_name); // 将目录名（进程号）转换为整数

            if (pid > 0) {
                // 进程号大于0表示有效的进程
                char proc_path[256];
                snprintf(proc_path, sizeof(proc_path), "/proc/%d/comm", pid); // 构建进程命令文件路径

                FILE *file = fopen(proc_path, "r"); // 打开命令文件以读取进程名称

                if (file) {
                    char name[256];

                    if (fgets(name, sizeof(name), file)) {
                        // 从文件中读取进程名称
                        printf("Process ID: %d, Name: %s", pid, name); // 打印进程ID和名称
                    }

                    fclose(file); // 关闭文件
                }
            }
        }
    }

    closedir(dir); // 关闭目录句柄
}

void killProcess(int pid) {
    if (kill(pid, SIGKILL) == 0) {
        printf("Process with PID %d killed.\n", pid); // 成功杀死进程，打印信息
    } else {
        perror("kill"); // 杀死进程失败，输出错误信息
    }
}

int main(int argc, char *argv[]) {
    if (argc == 1) {
        // 如果没有提供参数，列出所有进程
        listProcesses();
    } else if (argc == 2) {
        // 如果提供了一个参数（PID），尝试杀死指定进程
        int pid = atoi(argv[1]);

        if (pid > 0) {
            killProcess(pid);
        } else {
            printf("Invalid PID: %s\n", argv[1]); // 无效的PID，打印错误信息
        }
    } else {
        printf("Usage: %s [PID]\n", argv[0]); // 参数数量不正确，输出用法信息
        exit(EXIT_FAILURE); // 退出程序
    }

    return 0;
}
